home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
basic
/
sorts.bas
< prev
next >
Wrap
BASIC Source File
|
1992-06-17
|
20KB
|
445 lines
10 COLOR 14, 1: CLS : 'Filename: sorts.bas. 1992. Earle Arnow
15 GOSUB 6000
20 CLS : CLEAR : RANDOMIZE TIMER
30 LOCATE 9, 11: PRINT "MENU 2": PRINT TAB(9); STRING$(62, "-")
40 PRINT TAB(10); "1. Bubblesort"; TAB(36); "2. Endsort"
50 PRINT TAB(10); "3. Quicksort"; TAB(36); "4. Stripped Quicksort"
60 PRINT TAB(10); "5. Jumpsort"; TAB(36); "6. Flipsort"
70 PRINT TAB(10); "7. Fastsort"; TAB(36); "8. Insertion Sort"
80 PRINT TAB(10); "9. Shell-Metzner Sort"; TAB(35); "10. Smsort (Rewritten Shell-Metzner)"
90 PRINT TAB(9); "11. Run all sorts"; TAB(35); "12. Return to Menu 1"
100 PRINT
110 LOCATE 19, 10: INPUT "<ENTER> a number ===> ", NN
120 IF NN < 1 OR NN > 12 THEN LOCATE 19, 10: PRINT STRING$(30, " "): GOTO 110
125 IF NN = 12 THEN 700
130 CLS : LOCATE 9, 21: INPUT "Length of the array ", N
140 DIM A(N), A1(N), A2(N), S(50), A$(N), A1$(N), A2$(N)
145 IF S = 1 THEN 8000
150 CLS : PRINT "Unsorted array:": FOR Y = 1 TO N: R = INT(RND * N): A(Y) = R: PRINT A(Y); : A1(Y) = R: NEXT Y: PRINT ""
160 ON NN GOTO 200, 240, 270, 300, 330, 360, 390, 420, 450, 480, 600
200 T1 = TIMER: GOSUB 1000: T2 = TIMER: SEC1 = T2 - T1: PRINT "Bubblesort:": GOSUB 900
210 IF ZZ THEN GOSUB 920: GOTO 240
220 PRINT : PRINT TAB(20); "Bubblesort:"; SEC1; "seconds": GOTO 940
240 T1 = TIMER: GOSUB 1500: T2 = TIMER: SEC2 = T2 - T1: PRINT "Endsort:": GOSUB 900
250 IF ZZ THEN GOSUB 920: GOTO 270
260 PRINT : PRINT TAB(20); "Endsort:"; SEC2; "seconds": GOTO 940
270 T1 = TIMER: GOSUB 2000: T2 = TIMER: SEC3 = T2 - T1: PRINT "Quicksort:": GOSUB 900
280 IF ZZ THEN GOSUB 920: GOTO 300
290 PRINT : PRINT TAB(20); "Quicksort:"; SEC3; "seconds": GOTO 940
300 T1 = TIMER: GOSUB 2500: T2 = TIMER: SEC4 = T2 - T1: PRINT "Stripped quicksort:": GOSUB 900
310 IF ZZ THEN GOSUB 920: GOTO 330
320 PRINT : PRINT TAB(20); "Stripped quicksort:"; SEC4; "seconds": GOTO 940
330 T1 = TIMER: GOSUB 3000: T2 = TIMER: SEC5 = T2 - T1: PRINT "Jumpsort:": GOSUB 900
340 IF ZZ THEN GOSUB 920: GOTO 360
350 PRINT : PRINT TAB(20); "Jumpsort:"; SEC5; "seconds": GOTO 940
360 T1 = TIMER: GOSUB 3500: T2 = TIMER: SEC6 = T2 - T1: PRINT "Flipsort:": GOSUB 900
370 IF ZZ THEN GOSUB 920: GOTO 390
380 PRINT : PRINT TAB(20); "Flipsort:"; SEC6; "seconds": GOTO 940
390 T1 = TIMER: GOSUB 4000: T2 = TIMER: SEC7 = T2 - T1: PRINT "Fastsort:": GOSUB 900
400 IF ZZ THEN GOSUB 920: GOTO 420
410 PRINT : PRINT TAB(20); "Fastsort:"; SEC7; "seconds": GOTO 940
420 T1 = TIMER: GOSUB 4500: T2 = TIMER: SEC8 = T2 - T1: PRINT "Insertion sort:": GOSUB 900
430 IF ZZ THEN GOSUB 920: GOTO 450
440 PRINT : PRINT TAB(20); "Insertion sort:"; SEC8; "seconds": GOTO 940
450 T1 = TIMER: GOSUB 5000: T2 = TIMER: SEC9 = T2 - T1: PRINT "Shell-Metzner sort:": GOSUB 900
460 IF ZZ THEN GOSUB 920: GOTO 480
470 PRINT : PRINT TAB(20); "Shell-Metzner sort:"; SEC9; "seconds": GOTO 940
480 T1 = TIMER: GOSUB 5500: T2 = TIMER: SEC10 = T2 - T1: PRINT "smsort (rewritten Shell-Metzner):": GOSUB 900
490 IF ZZ THEN GOSUB 920: GOTO 510
500 PRINT : PRINT TAB(20); "Smsort (rewritten Shell-Metzner):"; SEC10; "seconds": GOTO 940
510 PRINT : PRINT "Bubblesort:"; SEC1; "seconds"; TAB(40); "Endsort:"; SEC2; "seconds"
520 PRINT "Quicksort:"; SEC3; "seconds"; TAB(40); "Stripped quicksort:"; SEC4; "seconds"
540 PRINT "Jumpsort:"; SEC5; "seconds"; TAB(40); "Flipsort:"; SEC6; "seconds"
550 PRINT "Fastsort:"; SEC7; "seconds"; TAB(40); "Insertion sort:"; SEC8; "seconds"
560 PRINT "Shell-Metzner sort:"; SEC9; "seconds"; TAB(40); "Smsort:"; SEC10; "seconds"
570 GOTO 940
600 ZZ = 1: GOTO 200
700 GOTO 10
890 '*** print sorted array
900 FOR Y = 1 TO N: PRINT A(Y); : NEXT Y: PRINT ""
910 RETURN
915 '*** Restore unsorted array
920 FOR Y = 1 TO N: A(Y) = A1(Y): NEXT Y: RETURN
940 PRINT : PRINT TAB(20); "Press any key to return to the MENU"
950 I$ = INPUT$(1): RUN
990 '*** Bubblesort
1000 F = 0
1010 FOR Y = 1 TO N - 1
1020 IF A(Y) > A(Y + 1) THEN SWAP A(Y), A(Y + 1): F = 1
1030 NEXT Y
1040 IF F = 0 THEN RETURN ELSE F = 0: GOTO 1010
1490 '*** endsort
1500 EN = N + 1
1510 EN = EN - 1
1520 IF EN = 1 THEN RETURN
1530 FOR Y = 1 TO EN - 1
1540 IF A(Y) > A(EN) THEN SWAP A(Y), A(EN)
1550 NEXT Y
1560 GOTO 1510
1990 '*** quicksort
2000 K8 = 0: I8 = 0
2010 S(I8 + 1) = 1: S(I8 + 2) = N
2020 K8 = K8 + 1
2030 IF K8 = 0 THEN RETURN
2040 K8 = K8 - 1: I8 = K8 + K8
2050 A8 = S(I8 + 1): B8 = S(I8 + 2)
2060 Z8 = A(A8): U8 = A8: L8 = B8 + 1
2070 L8 = L8 - 1
2080 IF L8 = U8 THEN 2130
2090 IF Z8 <= A(L8) THEN 2070 ELSE A(U8) = A(L8)
2100 U8 = U8 + 1
2110 IF L8 = U8 THEN 2130
2120 IF Z8 >= A(U8) THEN 2100 ELSE A(L8) = A(U8): GOTO 2070
2130 A(U8) = Z8
2140 IF B8 - U8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = U8 + 1: S(I8 + 2) = B8: K8 = K8 + 1
2150 IF L8 - A8 >= 2 THEN I8 = K8 + K8: S(I8 + 1) = A8: S(I8 + 2) = L8 - 1: K8 = K8 + 1
2160 GOTO 2030
2490 '*** stripped quicksort
2500 K8 = 0
2510 S1(K8) = 1: S2(K8) = N
2520 K8 = K8 + 1
2530 IF K8 = 0 THEN RETURN
2540 K8 = K8 - 1
2550 A8 = S1(K8): B8 = S2(K8)
2560 Z8 = A(A8): U8 = A8: L8 = B8 + 1
2570 L8 = L8 - 1
2580 IF L8 = U8 THEN 2630
2590 IF Z8 <= A(L8) THEN 2570 ELSE A(U8) = A(L8)
2600 U8 = U8 + 1
2610 IF L8 = U8 THEN 2630
2620 IF Z8 >= A(U8) THEN 2600 ELSE A(L8) = A(U8): GOTO 2570
2630 A(U8) = Z8
2640 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
2650 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
2660 GOTO 2530
2990 '*** jumpsort
3000 K8 = 0
3010 S1(K8) = 1: S2(K8) = N
3020 K8 = K8 + 1
3030 IF K8 = 0 THEN RETURN
3040 K8 = K8 - 1
3050 A8 = S1(K8): B8 = S2(K8)
3060 Z8 = A(A8): U8 = A8: L8 = B8 + 1
3070 L8 = L8 - 1
3080 IF L8 = U8 THEN 3130
3090 IF Z8 <= A(L8) THEN 3070 ELSE SWAP A(U8), A(L8)
3100 U8 = U8 + 1
3110 IF L8 = U8 THEN 3130
3120 IF Z8 >= A(U8) THEN 3100 ELSE SWAP A(L8), A(U8): GOTO 3070
3130 IF B8 - U8 >= 2 THEN S1(K8) = U8 + 1: S2(K8) = B8: K8 = K8 + 1
3140 IF L8 - A8 >= 2 THEN S1(K8) = A8: S2(K8) = L8 - 1: K8 = K8 + 1
3150 GOTO 3030
3490 '*** flipsort
3500 C = 0
3510 B1(C) = 1: B2(C) = N
3520 C = 1
3530 IF C = 0 THEN RETURN
3540 C = C - 1: D = B1(C): E = B2(C)
3550 F = D - 1: G = E
3560 F = F + 1
3570 IF F = G THEN 3620
3580 IF A(F) > A(G) THEN SWAP A(F), A(G) ELSE 3560
3590 G = G - 1
3600 IF F = G THEN 3620
3610 IF A(G) < A(F) THEN SWAP A(G), A(F): GOTO 3560 ELSE 3590
3620 IF E - F >= 2 THEN B1(C) = F + 1: B2(C) = E: C = C + 1
3630 IF G - D >= 2 THEN B1(C) = D: B2(C) = G - 1: C = C + 1
3640 GOTO 3530
3990 '*** fastsort
4000 C = 0
4010 B1(C) = 1: B2(C) = N
4020 C = C + 1
4030 IF C = 0 THEN RETURN
4040 C = C - 1
4050 D = B1(C): E = B2(C)
4060 Z = A(D): F = D - 1: G = E + 1
4070 FOR Y = D TO E
4080 IF Z > A(Y) THEN F = F + 1: A(F) = A(Y)
4090 IF Z < A(Y) THEN G = G - 1: A2(G) = A(Y)
4100 NEXT Y
4110 FOR Y = G TO E: A(Y) = A2(Y): NEXT Y
4120 FOR Y = F + 1 TO G - 1: A(Y) = Z: NEXT Y
4130 IF F - D > 0 THEN B1(C) = D: B2(C) = F: C = C + 1
4140 IF E - G > 0 THEN B1(C) = G: B2(C) = E: C = C + 1
4150 GOTO 4030
4490 '*** insertion sort
4500 FOR Y = 1 TO N - 1
4510 IF A(Y) > A(Y + 1) THEN SWAP A(Y), A(Y + 1) ELSE 4550
4520 D = Y - 1: IF D < 1 THEN 4550
4530 IF A(D) > A(D + 1) THEN SWAP A(D), A(D + 1) ELSE 4550
4540 D = D - 1: IF D >= 1 THEN 4530
4550 NEXT Y
4560 RETURN
4990 '*** Shell-Metzner sort
5000 M = N
5010 M = INT(M / 2)
5020 IF M = 0 THEN RETURN
5030 K = N - M: J = 1
5040 I = J
5050 L = I + M
5060 IF A(I) <= A(L) THEN 5100
5070 SWAP A(I), A(L): I = I - M
5090 IF I >= 1 THEN 5050
5100 J = J + 1
5110 IF J <= K THEN 5040 ELSE 5010
5490 '*** smsort (rewritten Shell-Metzner)
5500 M = N
5510 M = INT(M / 2): K = N - M
5520 IF M = 0 THEN RETURN
5530 FOR Y = 1 TO K
5540 IF A(Y) > A(Y + M) THEN SWAP A(Y), A(Y + M) ELSE 5580
5550 D = Y - M: IF D < 1 THEN 5580
5560 IF A(D) > A(D + M) THEN SWAP A(D), A(D + M) ELSE 5580
5570 D = D - M: IF D >= 1 THEN 5560
5580 NEXT Y
5590 GOTO 5510
5900 '
5995 'Menu 1
5997 '
6000 LOCATE 8, 20: PRINT "MENU 1": LOCATE 10, 20: PRINT "1. Discussion of sort methods": LOCATE 11, 20: PRINT "2. Run the sort programs": LOCATE 12, 20: PRINT "3. Exit to DOS"
6020 IN$ = INKEY$: IF IN$ = "1" THEN 7000 ELSE IF IN$ = "2" THEN CLS : GOTO 6100 E